﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using UricaoWeb.LogicaDeNegocios.Seguridad_y_Roles;
using UricaoWeb.LogicaDeNegocios.Tours;
using UricaoWeb.Datos.ConexionBD.Tours;

namespace UricaoWeb.Presentacion
{
    /// <summary>
    /// Recibe los datos necesarios para modificar un Tour, validandolos previamente
    /// </summary>
    public partial class API_tour_ModificarTour : API_Seguridad_Principal
    {

        List<String> _listaDias = new List<String>();
        private TourLogica _controlador = new TourLogica();
        private string _paginaRedireccion = "API_tour_BuscarTour.aspx";
        private int _idTourRecibido = 0;
        private int _idHotelRecibido = 0;
        private Tour _tour;
        private TourMaster _vista;
        private string _alerta = "";

        /// <summary>
        /// Se usa para trabajar con el Switch en la interfaz, permite saber si un registro estará Activo o Inactivo
        /// </summary>
        protected string Activado { get; set; }
        
        /// <summary>
        /// Cargar una nueva página con la referencia de un tour
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            var master = Master as MasterPage;
            if (master != null)
            {
                master.actualizar_label();
            }
            base.validar_usuario();
            Activado = "checked";

            
            bool inicio = Inicio();

            if (inicio)
            {
                if (Session["idTour"] != null)
                {
                    _idTourRecibido = int.Parse(Session["idTour"].ToString());
                }

                if (!IsPostBack)
                {
                    if (Session["idTour"] != null)
                    {
                        _tour = new Tour();
                        LlenarDatos(_idTourRecibido);
                    }
                    else
                    {
                        Redireccion();
                    }
                }
            }
            else
            {
                Redireccion();
            }
        }


        /// <summary>
        /// Método de carga inicial para la validacion del usuario
        /// </summary>
        /// <returns>Booleano de inicializacion</returns>
        private bool Inicio()
        {
            Logica_Usuario usuario = (Logica_Usuario)Session["user"];
            bool parsed = false;

            if (usuario != null)
            {
                parsed = Int32.TryParse(usuario.FkHotel, out _idHotelRecibido);
                if (!parsed)
                {
                    Console.WriteLine("Int32.TryParse no pudo realizar la conversion '{0}' a entero (int).\n", usuario.FkHotel);
                    _alerta = "Disculpe, no estamos disponibles en estos momentos";
                    MostrarAlerta();
                }
            }
            else
            {
                _paginaRedireccion = "API_Seguridad_Login_.aspx";
                Server.Transfer(_paginaRedireccion, false);
            }

            return parsed;
        }


        /// <summary>
        /// Cambia el mensaje del label de alerta
        /// </summary>
        private void MostrarAlerta()
        {
            alerta.Text = _alerta;
            alerta.Visible = true;
        }


       /// <summary>
       /// Modifica la información de un Tour
       /// </summary>
       /// <returns></returns>
        private bool ModificarTour(string nombre, string descripcion, List<String> listaDia, 
                                   string horainicio, string horafin, string capacidad, 
                                   string precio, bool activo)
        {
            bool peticion = false;

            try
            {
                peticion = _controlador.ModificarTour(_idTourRecibido, nombre, descripcion,
                                                                listaDia, horainicio, horafin,
                                                                capacidad, precio, activo);
            }
            catch (Exception e)
            {
                _alerta = "Disculpe, no se ha podido realizar la peticion. Intente más tarde ";
                MostrarAlerta();
            }
            return peticion;
        }


        /// <summary>
        /// Se construye una lista con los días seleccionados por el usuario
        /// </summary>
        private void AgregarDias()
        {
            string dia = "";
            if (lunes.Checked)
            {
                dia = "lunes";
                _listaDias.Add(dia);
            }

            if (martes.Checked)
            {
                dia= "martes";
                _listaDias.Add(dia);
            }

            if (miercoles.Checked)
            {
                dia = "miercoles";
                _listaDias.Add(dia);
            }

            if (jueves.Checked)
            {
                dia = "jueves";
                _listaDias.Add(dia);
            }
            if (viernes.Checked)
            {
                dia = "viernes";
                _listaDias.Add(dia);
            }
            if (sabado.Checked)
            {
                dia = "sabado";
                _listaDias.Add(dia);
            }
            if (domingo.Checked)
            {
                dia = "domingo";
                _listaDias.Add(dia);
            }

        }

        
        /// <summary>
        /// Se llenan los campos en pantalla con la información almacenada en bd previamente
        /// </summary>
        /// <param name="idTour">Identificador que permite diferenciar con que Tour se debe trabajar</param>
        private void LlenarDatos(int idTour)
        {
            _tour = ConsultarTourParametrizado(idTour);

            if (_tour != null)
            {
                _tour.IdTour = idTour;
                nombre.Text = _tour.NombreTour;
                descripcion.Text = _tour.DescripcionTour;
                capacidad.Text = _tour.CapacidadTour.ToString();
                precio.Text = _tour.PrecioTour.ToString();
                if (_tour.ActivoTour)
                    Activado = "checked";
                else
                    Activado = " ";

                _vista = (TourMaster)Master;
                
                ConsultarHorario(_tour.IdTour);
            }
        }

        /// <summary>
        /// Marca los días en pantalla que ya estaban almacenados en bd
        /// </summary>
        /// <param name="dias">Lista de días</param>
        private void LlenarDias(List<string> dias)
        {

            foreach (string item in dias)
            {
                switch (item)
                {
                    case "lunes":
                        lunes.Checked = true;
                        break;
                    case "martes":
                        martes.Checked = true;
                        break;
                    case "miercoles":
                        miercoles.Checked = true;
                        break;
                    case "jueves":
                        jueves.Checked = true;
                        break;
                    case "viernes":
                        viernes.Checked = true;
                        break;
                    case "sabado":
                        sabado.Checked = true;
                        break;
                    case "domingo":
                        domingo.Checked = true;
                        break;
                }
                
            }
        }

        /// <summary>
        /// Se habilita en interaz la información que puede ser modificada por el usuario
        /// </summary>
        private void CambiarEstadoDeCampos(bool estado)
        {
            lunes.Enabled = estado;
            martes.Enabled = estado;
            miercoles.Enabled = estado;
            jueves.Enabled = estado;
            viernes.Enabled = estado;
            sabado.Enabled = estado;
            domingo.Enabled = estado;
            horainicio.Enabled = estado;
            horafin.Enabled = estado;
            capacidad.Enabled = estado;
            precio.Enabled = estado;
            nombre.Enabled = estado;
            descripcion.Enabled = estado;
        }


        /// <summary>
        /// Consulta de los horarios de un Tour en específico y se vacia la misma en interfaz
        /// </summary>
        /// <param name="idTour">Identificador que permite diferenciar con que Tour se debe trabajar</param>
        private void ConsultarHorario(int idTour)
        {
            List<List<string>> itinerario = new List<List<string>>();

            try
            {
                itinerario = _controlador.ConsultarHorario(idTour);

                if (itinerario != null)
                {
                    List<string> dias = itinerario[0];
                    List<string> horas = itinerario[1];

                    LlenarDias(dias);

                    horainicio.Text = horas[0];
                    horafin.Text = horas[1];
                }
            }
            catch (Exception e)
            {
                _alerta = "No se ha podido encontrar itinerario para dicho tour ";
                MostrarAlerta();
            
            }
        }


        ///<summary>
        /// Método que devuelve un tour específico
        /// </summary>
        /// <param name="idTour">Id del tour</param>
        /// <returns>Tour especificado</returns>
        private Tour ConsultarTourParametrizado(int idTour)
        {

            List<Tour> lista = new List<Tour>();
            try
            {
                lista = _controlador.ConsultarTour(idTour);
                return lista[0];
            }
            catch
            {
                _alerta = "No existen tour(s) disponible(s) para el hotel ";
                MostrarAlerta();
            }

            return null;
        }

        
        protected string Mensaje { get; set; }

        /// <summary>
        /// Validación de que un tour ha sido Modificado con éxito, o ha presentado fallas en el registro
        /// </summary>
        /// <param name="sender">Objeto de tipo boton</param>
        /// <param name="e">Evento que realiza el usuario (hacer clic)</param>
        protected void Continuar(object sender, EventArgs e)
        {
            string nombretour = nombre.Text;
            string descripciontour = descripcion.Text;
            string horainicial = horainicio.Text;
            string horafinal = horafin.Text;
            string capacidadtour = capacidad.Text;
            string preciotour = precio.Text;
            bool activo;

            if (Request.Form["onoffswitch"] == "on")
                activo = true; //1
            else
                activo = false; //0

            AgregarDias();

            bool modificado = ModificarTour(nombretour, descripciontour, _listaDias, horainicial, horafinal, capacidadtour, preciotour, activo);

            Session["idTour"] = _idTourRecibido;

            if (modificado)
            {
                Session["actualizado"] = true;
                _paginaRedireccion = "API_tour_ConsultarTour.aspx";
                Server.Transfer(_paginaRedireccion);
            }
            else 
            {
                Session["actualizado"] = false;
                _alerta = "Disculpe, su petición no pudo ser procesada. Intente más tarde";
            }

        }

        /// <summary>
        /// Redireccionar a otra página
        /// </summary>
        private void Redireccion()
        {
            Response.Redirect(_paginaRedireccion);
        }

        /// <summary>
        /// Boton que permite regresar a la pantalla anterior consultarTour
        /// </summary>
        protected void Regresar(object sender, EventArgs e)
        {
            Redireccion();
        }


        protected void TextBox1_TextChanged(object sender, EventArgs e)
        {

        }
    

    }
}